﻿namespace WopiHost.Core.Models;

/// <summary>
/// Model according to <see href="https://learn.microsoft.com/en-us/microsoft-365/cloud-storage-partner-program/rest/files/checkfileinfo">CheckFileInfo documentation</see> and <see href="https://msdn.microsoft.com/en-us/library/hh622920.aspx">Microsoft WOPI documentation</see>
/// </summary>
public class CheckFileInfo
{
    #region "Required properties"

    /// <summary>
    /// 文件的名称，包括扩展名，不包含路径。用于在用户界面 (UI) 中显示，并确定文件的扩展名。
    /// </summary>
    public string BaseFileName { get; set; }

    /// <summary>
    /// 文件所有者的唯一标识符字符串。在大多数情况下，应该考虑上传或创建文件的用户作为所有者。此 ID 必须满足唯一性和一致性要求。有关详细信息，请参阅 <see href="https://learn.microsoft.com/en-us/microsoft-365/cloud-storage-partner-program/rest/files/checkfileinfo/checkfileinfo-response#requirements-for-user-identity-properties">用户身份属性要求</see>。
    /// </summary>
    public string OwnerId { get; set; }

    /// <summary>
    /// 文件的大小（以字节为单位），表示为 long，即 64 位有符号整数。
    /// </summary>
    public long Size { get; set; }

    /// <summary>
    /// 当前访问文件的用户的唯一标识符字符串。此 ID 必须满足唯一性和一致性要求。有关详细信息，请参阅 <see href="https://learn.microsoft.com/en-us/microsoft-365/cloud-storage-partner-program/rest/files/checkfileinfo/checkfileinfo-response#requirements-for-user-identity-properties">用户身份属性要求</see>。
    /// </summary>
    public string UserId { get; set; }

    /// <summary>
    /// 基于服务器文件版本模式的文件的当前版本，表示为字符串。当文件更改时，此值必须更改，且对于给定文件，版本值永不重复。
    /// 此值必须是一个字符串，即使数字用于表示版本。
    /// </summary>
    public string Version { get; set; }

    #endregion

    #region "Optional properties"

    /// <summary>
    /// 表示文件上次修改时间的字符串值。此时间必须始终是 UTC 时间，并且必须以 ISO 8601 往返格式进行格式化。例如，<c>"2009-06-15T13:45:30.0000000Z"</c>。
    /// </summary>
    public string LastModifiedTime { get; set; }

    /// <summary>
    /// 表示文件的文件扩展名的字符串值。此值必须以 <c>.</c> 开头。如果提供，则 WOPI 客户端将使用此值作为文件扩展名。否则，将从 <see cref="BaseFileName"/> 解析扩展名。
    /// </summary>
    public string FileExtension { get; set; }

    /// <summary>
    /// 指示 WOPI 主机支持的文件名的最大长度，不包括文件扩展名。默认值为 250。请注意，如果省略该属性或将其显式设置为 <c>0</c>，则 WOPI 客户端将使用此默认值。
    /// </summary>
    public int FileNameMaxLength { get; set; }

    /// <summary>
    /// 指示主机的品牌名称的字符串。
    /// </summary>
    public string BreadcrumbBrandName { get; set; }

    /// <summary>
    /// 导航到用户单击显示 
    /// <see cref="BreadcrumbBrandName"/> 的 UI 时应由 WOPI 客户端导航到的网页的 URI。
    /// </summary>
    public string BreadcrumbBrandUrl { get; set; }

    /// <summary>
    /// 表示文件的名称的字符串。如果未提供此值，则 WOPI 客户端可能会使用 <see cref="BaseFileName"/> 值。
    /// </summary>
    public string BreadcrumbDocName { get; set; }

    /// <summary>
    /// 适用于当用户单击显示 
    /// <see cref="BreadcrumbDocName"/> 的 UI 时 WOPI 客户端导航到的网页的 URI。
    /// </summary>
    public string BreadcrumbDocUrl { get; set; }

    /// <summary>
    /// 表示包含文件的容器的名称的字符串。
    /// </summary>
    public string BreadcrumbFolderName { get; set; }

    /// <summary>
    /// 导航到用户单击显示 
    /// <see cref="BreadcrumbFolderName"/> 的 UI 时应由 WOPI 客户端导航到的网页的 URI。
    /// </summary>
    public string BreadcrumbFolderUrl { get; set; }

    /// <summary>
    /// 用户可访问的直接到文件的 URI，用于通过客户端打开文件。
    /// </summary>
    public string ClientUrl { get; set; }

    /// <summary>
    /// 一个布尔值，指示 WOPI 客户端在用户激活 WOPI 客户端中任何 <c>Close</c> UI 时应关闭窗口或选项卡。
    /// </summary>
    public bool CloseButtonClosesWindow { get; set; }

    /// <summary>
    /// WOPI 客户端在应用程序关闭或出现不可恢复错误时应导航到的网页的 URI。
    /// </summary>
    public string CloseUrl { get; set; }

    /// <summary>
    /// 一个布尔值，指示 WOPI 客户端应禁用浏览器缓存用户内容的缓存。请注意，这对基于网络浏览器的 WOPI 客户端具有重要的性能影响。
    /// </summary>
    public bool DisableBrowserCachingOfUserContent { get; set; }

    /// <summary>
    /// 一个布尔值，指示 WOPI 客户端可以连接到 Microsoft 服务以提供端用户功能。
    /// </summary>
    public bool AllowAdditionalMicrosoftServices { get; set; }

    /// <summary>
    /// 一个布尔值，指示在发生错误时，WOPI 客户端是否允许提示用户获取有关其特定错误的详细报告的权限。所收集的信息可能包括用户的文件和其他特定于会话的状态。
    /// </summary>
    public bool AllowErrorReportPrompt { get; set; }

    /// <summary>
    /// 一个布尔值，指示 WOPI 客户端是否允许连接到文件中引用的外部服务（例如，可嵌入的 JavaScript 应用程序市场）。
    /// </summary>
    public bool AllowExternalMarketplace { get; set; }

    /// <summary>
    /// 一个布尔值，指示 WOPI 客户端应禁用所有打印功能。
    /// </summary>
    public bool DisablePrint { get; set; }

    /// <summary>
    /// 一个布尔值，指示 WOPI 客户端应禁用所有机器翻译功能。
    /// </summary>
    public bool DisableTranslation { get; set; }

    /// <summary>
    /// 用户可访问文件的 URI，用于允许用户下载文件的副本。此 URI 应直接下载文件，并始终提供文件的最新版本。
    /// </summary>
    public string DownloadUrl { get; set; }

    /// <summary>
    /// 一个 URI，允许用户创建文件的可嵌入 URI 的位置。
    /// </summary>
    public string FileEmbedCommandUrl { get; set; }

    /// <summary>
    /// 允许用户共享文件的位置的 URI。
    /// </summary>
    public string FileSharingUrl { get; set; }

    /// <summary>
    /// WOPI 客户端用于获取文件的文件位置的 URI。
    /// </summary>
    public string FileUrl { get; set; }

    /// <summary>
    /// 允许用户查看文件版本历史记录的位置的 URI。
    /// </summary>
    public string FileVersionUrl { get; set; }

    /// <summary>
    /// 当前访问文件的用户的唯一标识字符串值。
    /// </summary>
    public string HostAuthenticationId { get; set; }

    /// <summary>
    /// 一个 URI，用于加载编辑 WOPI 操作的
    /// <see href="https://learn.microsoft.com/en-us/microsoft-365/cloud-storage-partner-program/glossary#host-page">host page
    /// </see> that loads the 
    /// <c>edit</c> WOPI action.
    /// </summary>
    public string HostEditUrl { get; set; }

    /// <summary>
    /// 一个 URI，用于提供文件的编辑体验的网页，该体验可以嵌入到另一个 HTML 页面中。
    /// </summary>
    public string HostEmbeddedEditUrl { get; set; }

    /// <summary>
    /// 一个 URI，用于提供文件的查看体验的网页，该体验可以嵌入到另一个 HTML 页面中。通常是指一个 
    /// <see href="https://learn.microsoft.com/en-us/microsoft-365/cloud-storage-partner-program/glossary#host-page">主机页面</see>，加载 <c>embedview</c> WOPI 操作。
    /// </summary>
    public string HostEmbeddedViewUrl { get; set; }

    /// <summary>
    /// 由 WOPI 服务器提供的用于日志记录和其他信息目的的名称字符串。
    /// </summary>
    public string HostName { get; set; }

    /// <summary>
    /// 主机用于向 WOPI 客户端传递任意信息的字符串。
    /// </summary>
    public string HostNotes { get; set; }

    /// <summary>
    /// 文件的 REST 操作的基本 URI。
    /// </summary>
    public string HostRestUrl { get; set; }

    /// <summary>
    /// 一个 URI，用于加载查看 WOPI 操作的 此 URL 用于 Office Online 在查看模式和编辑模式之间导航。.
    /// <see href="https://learn.microsoft.com/en-us/microsoft-365/cloud-storage-partner-program/glossary#host-page">
    /// </see>
    /// </summary>
    public string HostViewUrl { get; set; }

    /// <summary>
    /// WOPI 客户端应向用户显示的字符串，指示文件的 IRM 策略。此值应与 
    /// <see cref="IrmPolicyTitle"/> 结合使用。
    /// </summary>
    public string IrmPolicyDescription { get; set; }

    /// <summary>
    /// WOPI 客户端应向用户显示的字符串，指示文件的 IRM 策略。此值应与 <see cref="IrmPolicyDescription"/> 结合使用。
    /// </summary>
    public string IrmPolicyTitle { get; set; }

    /// <summary>
    /// 用于发现有关用户在线状态的信息提供程序（例如，用户是否通过即时消息工具可用）的标识字符串。
    /// </summary>
    public string PresenceProvider { get; set; }

    /// <summary>
    /// 在 <see cref="PresenceProvider"/> 上下文中标识用户的字符串。
    /// </summary>
    public string PresenceUserId { get; set; }

    /// <summary>
    /// 解释 WOPI 服务器隐私策略的网页的 URI。
    /// </summary>
    public string PrivacyUrl { get; set; }

    /// <summary>
    /// 指示 WOPI 客户端是否应采取措施阻止文件的复制和打印的布尔值。
    /// </summary>
    public bool ProtectInClient { get; set; }

    /// <summary>
    /// 允许用户使用主机的身份验证系统登录的 URI。在支持匿名用户时可使用此属性。如果不提供此属性，则 Office Online 不会显示登录 UI。
    /// <para>See also <seealso cref="SignoutUrl"/></para>
    /// </summary>
    public string SignInUrl { get; set; }

    /// <summary>
    /// 对于此用户，指示文件是否为只读的布尔值。
    /// </summary>
    public bool ReadOnly { get; set; }

    /// <summary>
    /// 指示 WOPI 客户端是否应限制用户对文件执行的操作的布尔值。此属性的行为取决于 WOPI 客户端。
    /// </summary>
    public bool RestrictedWebViewOnly { get; set; }

    /// <summary>
    /// 文件内容的 256 位 SHA-2 编码 [<see href="http://csrc.nist.gov/publications/fips/fips180-2/fips180-2.pdf">FIPS 180-2</see>] 哈希，作为 Base64 编码的字符串。在 WOPI 客户端中用于缓存目的。
    /// </summary>
    public string Sha256 { get; set; }

    /// <summary>
    /// 如果主机可以保证具有相同内容的两个不同文件具有相同的 UniqueContentId 值，则可以提供此字符串值，而不是 SHA256 值。
    /// </summary>
    public string UniqueContentId { get; set; }

    /// <summary>
    /// 将当前用户从主机的身份验证系统中注销的 URI。
    /// </summary>
    public string SignoutUrl { get; set; }

    /// <summary>
    /// 指示 WOPI 服务器是否支持多用户同时对此文件进行更改的布尔值。
    /// </summary>
    public bool SupportsCoauth { get; set; }

    /// <summary>
    /// 指示主机是否支持以下 WOPI 操作的布尔值：
    /// 这些操作仅由 OneNote for the web 使用，因此不需要与 Office for the web 或 Office for iOS 集成。这些仅用于完整性，但不需要实现。
    /// </summary>
    public bool SupportsCobalt { get; set; }

    /// <summary>
    /// 指示主机是否支持以下 WOPI 操作的布尔值：
    /// <list type="bullet">
    /// <item>
    /// <description>CheckFolderInfo - 此操作仅由 OneNote for the web 使用，因此不需要与 Office for the web 或 Office for iOS 集成。仅用于完整性，但不需要实现。</description>
    /// </item>
    /// <item>
    /// <description>EnumerateChildren（文件夹） - 此操作仅由 OneNote for the web 使用，因此不需要与 Office for the web 或 Office for iOS 集成。仅用于完整性，但不需要实现。</description>
    /// </item>
    /// <item>
    /// <description><see href="https://learn.microsoft.com/en-us/microsoft-365/cloud-storage-partner-program/rest/files/deletefile">DeleteFile</see></description>
    /// </item>
    /// </list>
    /// </summary>   
    public bool SupportsFolders
    {
        get => SupportsContainers;
        set => SupportsContainers = value;
    }

    /// <summary>
    /// 指示主机是否支持以下 WOPI 操作的布尔值：
    /// <list type="bullet">
    /// <item>
    /// <description><see href="https://learn.microsoft.com/en-us/microsoft-365/cloud-storage-partner-program/rest/containers/checkcontainerinfo">CheckContainerInfo</see></description>
    /// </item>
    /// <item>
    /// <description><see href="https://learn.microsoft.com/en-us/microsoft-365/cloud-storage-partner-program/rest/containers/createchildcontainer">CreateChildContainer</see></description>
    /// </item>
    /// <item>
    /// <description><see href="https://learn.microsoft.com/en-us/microsoft-365/cloud-storage-partner-program/rest/containers/createchildfile">CreateChildFile</see></description>
    /// </item>
    /// <item>
    /// <description><see href="https://learn.microsoft.com/en-us/microsoft-365/cloud-storage-partner-program/rest/containers/deletecontainer">DeleteContainer</see></description>
    /// </item>
    /// <item>
    /// <description><see href="https://learn.microsoft.com/en-us/microsoft-365/cloud-storage-partner-program/rest/files/deletefile">DeleteFile</see></description>
    /// </item>
    /// <item>
    /// <description><see href="https://learn.microsoft.com/en-us/microsoft-365/cloud-storage-partner-program/rest/containers/enumerateancestors">EnumerateAncestors (containers)</see></description>
    /// </item>
    /// <item>
    /// <description><see href="https://learn.microsoft.com/en-us/microsoft-365/cloud-storage-partner-program/rest/files/enumerateancestors">EnumerateAncestors (files)</see></description>
    /// </item>
    /// <item>
    /// <description><see href="https://learn.microsoft.com/en-us/microsoft-365/cloud-storage-partner-program/rest/containers/enumeratechildren">EnumerateChildren (containers)</see></description>
    /// </item>
    /// <item>
    /// <description><see href="https://learn.microsoft.com/en-us/microsoft-365/cloud-storage-partner-program/rest/containers/getecosystem">GetEcosystem (containers)</see></description>
    /// </item>
    ///  <item>
    /// <description><see href="https://learn.microsoft.com/en-us/microsoft-365/cloud-storage-partner-program/rest/containers/renamecontainer">RenameContainer</see></description>
    /// </item>
    /// </list>
    /// </summary>
    public bool SupportsContainers { get; set; }

    /// <summary>
    /// 指示主机是否支持以下 WOPI 操作的布尔值：
    /// <list type="bullet">
    /// <item>
    /// <description><see href="https://learn.microsoft.com/en-us/microsoft-365/cloud-storage-partner-program/rest/files/lock">Lock</see></description>
    /// </item>
    /// <item>
    /// <description><see href="https://learn.microsoft.com/en-us/microsoft-365/cloud-storage-partner-program/rest/files/unlock">Unlock</see></description>
    /// </item>
    /// <item>
    /// <description><see href="https://learn.microsoft.com/en-us/microsoft-365/cloud-storage-partner-program/rest/files/refreshlock">RefreshLock</see></description>
    /// </item>
    /// <item>
    /// <description><see href="https://learn.microsoft.com/en-us/microsoft-365/cloud-storage-partner-program/rest/files/unlockandrelock">UnlockAndRelock</see> operations for this file.</description>
    /// </item>
    /// </list>
    /// </summary>
    public bool SupportsLocks { get; set; }

    /// <summary>
    /// 指示主机是否支持 <see href="https://learn.microsoft.com/en-us/microsoft-365/cloud-storage-partner-program/rest/files/getlock">GetLock</see> 操作的布尔值。
    /// </summary>
    public bool SupportsGetLock { get; set; }

    /// <summary>
    /// 指示主机是否支持长达 1024 个 ASCII 字符的锁定 ID。如果未提供，则 WOPI 客户端将假定锁定 ID 限制为 256 个 ASCII 字符。
    /// </summary>
    public bool SupportsExtendedLockLength { get; set; }

    /// <summary>
    /// 指示主机是否支持以下 WOPI 操作的布尔值：
    /// <list type="bullet">
    /// <item>
    /// <description><see href="https://learn.microsoft.com/en-us/microsoft-365/cloud-storage-partner-program/rest/ecosystem/checkecosystem">CheckEcosystem</see></description>
    /// </item>
    /// <item>
    /// <description><see href="https://learn.microsoft.com/en-us/microsoft-365/cloud-storage-partner-program/rest/containers/getecosystem">GetEcosystem (containers)</see></description>
    /// </item>
    ///  <item>
    /// <description><see href="https://learn.microsoft.com/en-us/microsoft-365/cloud-storage-partner-program/rest/files/getecosystem">GetEcosystem (files)</see></description>
    /// </item>
    /// <item>
    /// <description><see href="https://learn.microsoft.com/en-us/microsoft-365/cloud-storage-partner-program/rest/ecosystem/getrootcontainer">GetRootContainer (ecosystem)</see></description>
    /// </item>
    /// </list>
    /// </summary>
    public bool SupportsEcosystem { get; set; }

    /// <summary>
    /// 指示主机是否支持 
    /// <see href="https://learn.microsoft.com/en-us/microsoft-365/cloud-storage-partner-program/rest/ecosystem/getfilewopisrc">GetFileWopiSrc（生态系统）</see> 操作的布尔值。
    /// </summary>
    public bool SupportsGetFileWopiSrc { get; set; }

    /// <summary>
    /// 包含主机支持的 <see href="https://learn.microsoft.com/en-us/microsoft-365/cloud-storage-partner-program/rest/concepts#share-url">Share URL</see> 类型的字符串数组。
    /// 这些类型可以在 X-WOPI-UrlType 请求标头中传递，以表示返回的 Share URL 类型，
    /// 用于 <see href="https://learn.microsoft.com/en-us/microsoft-365/cloud-storage-partner-program/rest/files/getshareurl">GetShareUrl（文件）</see> 操作。
    /// <para> 可能的值：
    /// <list type="bullet">
    /// <item>
    /// <description>ReadOnly - 此类型的 Share URL 允许用户使用 URL 查看文件，但不授予编辑文件的权限。</description>
    /// </item>
    /// <item>
    /// <description>ReadWrite - 此类型的 Share URL 允许用户使用 URL 查看和编辑文件。</description>
    /// </item>
    /// </list>
    /// </para>
    /// </summary>
    public IEnumerable<string> SupportedShareUrlTypes { get; set; }

    /// <summary>
    /// 指示主机是否支持用户可以通过受限 URL 在文件上进行有限操作的场景的布尔值。
    /// </summary>
    public bool SupportsScenarioLinks { get; set; }

    /// <summary>
    /// 指示主机是否支持使用文件中存储的凭据对安全数据存储进行调用的布尔值。
    /// </summary>
    public bool SupportsSecureStore { get; set; }

    /// <summary>
    /// 指示主机是否支持使用 WOPI 客户端创建新文件的布尔值。
    /// </summary>
    public bool SupportsFileCreation { get; set; }

    /// <summary>
    /// 指示主机是否支持以下 WOPI 操作的布尔值：
    /// <list type="bullet">
    /// <item>
    /// <description><see href="https://learn.microsoft.com/en-us/microsoft-365/cloud-storage-partner-program/rest/files/putfile">PutFile</see></description>
    /// </item>
    /// <item>
    /// <description><see href="https://learn.microsoft.com/en-us/microsoft-365/cloud-storage-partner-program/rest/files/putrelativefile">PutRelativeFile</see></description>
    /// </item>
    /// </list>
    /// </summary>
    public bool SupportsUpdate { get; set; }

    /// <summary>
    /// 指示主机是否支持重命名
    /// <see href="https://learn.microsoft.com/en-us/microsoft-365/cloud-storage-partner-program/rest/files/renamefile">
    /// RenameFile
    /// </see> 操作的布尔值。
    /// </summary>
    public bool SupportsRename { get; set; }

    /// <summary>
    /// 指示主机是否支持删除文件 <see href="https://learn.microsoft.com/en-us/microsoft-365/cloud-storage-partner-program/rest/files/deletefile">DeleteFile</see> 操作的布尔值。
    /// </summary>
    public bool SupportsDeleteFile { get; set; }

    /// <summary>
    /// 指示主机是否支持修改用户信息 <see href="https://learn.microsoft.com/en-us/microsoft-365/cloud-storage-partner-program/rest/files/deletefile">DeleteFile</see> 操作的布尔值。
    /// </summary>
    public bool SupportsUserInfo { get; set; }

    /// <summary>
    /// 包含有关用户的信息的字符串值。可以通过 
    /// <see href="https://learn.microsoft.com/en-us/microsoft-365/cloud-storage-partner-program/rest/files/putuserinfo">PutUserInfo</see> 
    /// 操作从 WOPI 客户端传递给主机。
    /// </summary>
    public string UserInfo { get; set; }

    /// <summary>
    /// 包含用户所属的 '租户' 或群组/组织的唯一标识字符串值。
    /// </summary>
    public string TenantId { get; set; }

    /// <summary>
    /// 解释 WOPI 服务器使用条款的网页的 URI。
    /// </summary>
    public string TermsOfUseUrl { get; set; }

    /// <summary>
    /// 用于将时区信息传递给WOPI客户端。此值的格式由主机决定。
    /// </summary>
    public string TimeZone { get; set; }

    /// <summary>
    /// 指示用户是否已通过主机身份验证。主机应始终将其设置为 true
    /// <c>true</c> for unauthenticated users, so that clients are aware that the user is anonymous.
    /// </summary>
    public bool IsAnonymousUser { get; set; }

    /// <summary>
    /// 指示用户是否为教育用户。
    /// </summary>
    public bool IsEduUser { get; set; }

    /// <summary>
    /// 指示用户是否为业务用户。
    /// <para>
    /// See also <seealso href="https://learn.microsoft.com/en-us/microsoft-365/cloud-storage-partner-program/online/scenarios/business">Supporting document editing for business users</seealso>
    /// </para>
    /// </summary>
    public bool LicenseCheckForEditIsEnabled { get; set; }

    /// <summary>
    /// 表示用户有权查看
    /// <see href="https://learn.microsoft.com/en-us/microsoft-365/cloud-storage-partner-program/glossary#broadcast">broadcast</see> of this file.
    /// </summary>
    public bool UserCanAttend { get; set; }

    /// <summary>
    /// 表示用户没有足够的权限在WOPI服务器上创建新文件。将其设置为true
    /// </summary>
    public bool UserCanNotWriteRelative { get; set; }

    /// <summary>
    /// 表示用户有权
    /// </summary>
    public bool UserCanPresent { get; set; }

    /// <summary>
    /// 表示用户有权更改文件
    /// </summary>
    public bool UserCanWrite { get; set; }

    /// <summary>
    /// 一个布尔值，表示用户有权重命名当前文件。
    /// </summary>
    public bool UserCanRename { get; set; }

    /// <summary>
    /// 一个字符串，它是用户的名称，适合在UI中显示。
    /// </summary>
    public string UserFriendlyName { get; set; }

    /// <summary>
    /// 唯一标识当前访问文件的用户的字符串值。
    /// </summary>
    public string UserPrincipalName { get; set; }

    /// <summary>
    /// 一个布尔值，指示WOPI客户端不得允许用户编辑文件。
    /// </summary>
    public bool WebEditingDisabled { get; set; }

    #endregion
}
